package br.com.jmed.service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.jmed.dao.GruposMenusDao;
import br.com.jmed.dao.MenusDao;
import br.com.jmed.dao.Parametros;
import br.com.jmed.dao.SenhaDao;
import br.com.jmed.dao.UsuarioDao;
import br.com.jmed.model.GruposMenus;
import br.com.jmed.model.Menus;
import br.com.jmed.model.Senha;
import br.com.jmed.model.Usuario;
import br.com.jmed.model.UsuariosGrupo;

@Stateless
public class SegurancaService implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Inject
	private UsuarioDao usuarioDao;

	@Inject
	private SenhaDao senhaDao;

	@Inject
	private GruposMenusDao gruposMenusDao;
	
	@Inject
	private MenusDao menusDao;

	public List<Menus> getListMenus(){
		return menusDao.findToList("Menus.findAll", new Parametros[0]);
	}
	
	public List<GruposMenus> getPermissoes(List<UsuariosGrupo> listGrupo) {
		if(listGrupo == null) return null;
		List<Integer> gruposCodigos = new ArrayList<Integer>();
		for (UsuariosGrupo usuariosGrupo : listGrupo) {
			gruposCodigos.add(usuariosGrupo.getGrupo().getCodigo());
		}
		Parametros<List<Integer>> parametros = new Parametros<List<Integer>>();
		parametros.setNome("grupos");
		parametros.setValor(gruposCodigos);
		return gruposMenusDao.findToList("GruposMenus.findGruposAtivos", parametros);
	}

	public Usuario login(String login, String senha) throws Exception {
		Parametros<String> parametros = new Parametros<String>();
		parametros.setNome("login");
		parametros.setValor(login);
		Usuario usuario = usuarioDao.findSingleResult("Usuario.findByLogin", parametros);

		if (usuario == null) {
			throw new Exception("Usuario/Senha não encontrados.");
		} else if (!usuario.getSituacao().equals("A")) {
			throw new Exception("Usuario inativo.");
		}

		Parametros<String> parametrosSenha = new Parametros<String>();
		parametrosSenha.setNome("senha");
		parametrosSenha.setValor(senha);
		
		Parametros<Integer> parametrosCodigoUsuario = new Parametros<Integer>();
		parametrosCodigoUsuario.setNome("usuario");
		parametrosCodigoUsuario.setValor(usuario.getCodigo());
		
		Senha senhaUsuario = senhaDao.findSingleResult("Senha.findSenhaUsuario",parametrosSenha,parametrosCodigoUsuario);

		try {
			if (senhaUsuario == null) {
				throw new Exception("Usuario/Senha não encontrados.");
			} else if (senhaUsuario.getDataValidade().getTime() < new Date().getTime()) {
				throw new Exception("Senha expirada.");
			} else if (!senhaUsuario.getSituacao().equals("A")) {
				throw new Exception("Usuario inativo");
			}
			
			usuario.setDataUltimoAcesso(new Date());
			usuario.setTentativas(0);
			usuarioDao.merge(usuario);
		} catch (Exception e) {
			usuario.setTentativas(usuario.getTentativas() + 1);
			usuario.setDataAlteracao(new Date());
			if (usuario.getTentativas() > 3) {
				usuario.setSituacao("I");
			}
			usuarioDao.merge(usuario);
			throw e;
		}

		return usuario;

	}

	public void setUsuarioDao(UsuarioDao usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	public void setSenhaDao(SenhaDao senhaDao) {
		this.senhaDao = senhaDao;
	}

	public void setGruposMenusDao(GruposMenusDao gruposMenusDao) {
		this.gruposMenusDao = gruposMenusDao;
	}

	public void setMenusDao(MenusDao menusDao) {
		this.menusDao = menusDao;
	}	

}
